/*
 * bsp_nfc_fm17622.c
 *
 *  Created on: 2023年8月25日
 *      Author: fjx
 */
#include "bsp_nfc.h"
#include "bsp_nfc_fm17622_reg.h"
#include "device_type.h"
#include "bsp_i2c.h"
#include "app_log.h"
#include "app_gpio_i2c_fm17622.h"
#include "softwareMultiTimer.h"
#include "app_led.h"

#ifdef FM17622_DRIVER
/*
 * EA = 0,bit6~bit3 0101b,  bit2~bit0由ADR_2~ADR_0
 * EA =1 ,ADR6 = 0,   0010,010x
 * I2C  bit6  bit5  bit4  bit3  bit2  bit1  bit0
        ADR_6 ADR_5 ADR_4 ADR_3 ADR_2 ADR_1 ADR_0
        0      0      1     0     0     1     0
 *
 */
#define FM17622_ADDR                                   (0x12<<1)


void mDelay(uint32_t ms)
{
#if 1
  uint32_t cur_tm,tm;

  tm = READ_SYS_RTC_COUNT();
  while(1){
      cur_tm=READ_SYS_RTC_COUNT();
      if((cur_tm-tm)*30 >= ms*1000){
          return;
      }
  }
#endif
}
/*
 * NPD置1
 */
void fm17622_set_npd_gpio (void)
{
//TODO:需要对GPIO进行操作
  keyPad_led_off(NFC_RST);
}
/*
 * NPD=0
 */
void fm17622_clr_npd_gpio (void)
{
  //TODO:需要对GPIO进行操作
  keyPad_led_on(NFC_RST);
}
/*
 *param  mode = 1,推出HPD模式; mode = 0,进入HPD模式
 */
void fm17622_hpd(uint8_t mode)
{
  if(mode == 0x00){
      //TODO:1.官方要求延迟1ms,等待之前的操作结束，
      //     2.再对NPD=0,进入HPD模式

      //delay 1ms
      mDelay(8);
      fm17622_clr_npd_gpio();
  }
  else{
      //TODO:对NPD=1后，需要延时1ms等待FM17622启动
      fm17622_set_npd_gpio(); //NPD=1,退出HPD
      //delay 1ms
      mDelay(8); //TODO:测试7ms
  }
}
/*
 * I2C reg read
 */
uint8_t fm17622_get_reg (uint8_t addr,uint8_t *pdata)
{
  I2C_LeaderRead(FM17622_ADDR,addr&0x3F,pdata,1);
  return 0;
}
uint8_t fm17622_set_reg (uint8_t addr,uint8_t data)
{
  I2C_LeaderWrite(FM17622_ADDR,addr&0x3F,&data,1);
  return 0;
}
uint8_t fm17622_modify_reg (uint8_t addr,uint8_t mask,uint8_t set)
{
  uint8_t regdata;

  fm17622_get_reg(addr,&regdata);

  if(set){
      regdata |= mask;
  }
  else{
      regdata &= ~mask;
  }

  fm17622_set_reg(addr,regdata);
  return 0;
}

uint8_t fm17622_write_fifo(uint8_t len,uint8_t *pdata)
{
  I2C_LeaderWrite(FM17622_ADDR,JREG_FIFODATA&0x3F,pdata,len);
  return 0;
}


uint8_t fm17622_read_fifo(uint8_t len,uint8_t *pdata)
{
  I2C_LeaderRead(FM17622_ADDR,JREG_FIFODATA&0x3F,pdata,len);
  return 0;
}
void fm17622_get_reg_ext(uint8_t addr,uint8_t *pdata)
{
  fm17622_set_reg(JREG_EXT_REG_ENTRANCE,JBIT_EXT_REG_RD_ADDR + addr);
  fm17622_get_reg(JREG_EXT_REG_ENTRANCE,&(*pdata));
}
/*
 *  写扩展寄存器
 */
void fm17622_set_reg_ext(uint8_t addr,uint8_t data)
{
  fm17622_set_reg(JREG_EXT_REG_ENTRANCE,JBIT_EXT_REG_WR_ADDR + addr);
  fm17622_set_reg(JREG_EXT_REG_ENTRANCE,JBIT_EXT_REG_WR_DATA + data);
}
void fm17622_modify_reg_ext(uint8_t addr,uint8_t mask,uint8_t set)
{
  uint8_t regdata;

  fm17622_get_reg_ext(addr,&regdata);

  if(set){
      regdata |= mask;
  }
  else{
      regdata &= ~(mask);
  }

  fm17622_set_reg_ext(addr,regdata);
}
void fm17622_clear_fifo(void)
{
  uint8_t regdata;
  fm17622_get_reg(JREG_FIFOLEVEL,&regdata);
  if((regdata & 0x7F) != 0)     //FIFO如果不空，则FLUSH FIFO
  {
      fm17622_set_reg(JREG_FIFOLEVEL,JBIT_FLUSHFIFO);
  }
}

void fm17622_hard_reset (void)
{
//TODO: 需要进行改造，不能进行堵塞

  fm17622_hpd(0);//NPD=0
  mDelay(1);
  fm17622_hpd(1);//NPD=1
  mDelay(10);
}
uint8_t fm17622_soft_reset (void)
{
  uint8_t reg_data;
  fm17622_set_reg(JREG_COMMAND,CMD_SOFT_RESET);
  DS_app_log_info("soft reset\n");
  mDelay(2);//FM17622芯片复位需要2ms
  //TODO:需要对delay进行改造
  fm17622_get_reg(JREG_COMMAND,&reg_data);
  DS_app_log_info("fm17622 soft reset 0x%0X\n",reg_data);
  if(reg_data == 0x20)
    return SUCCESS;
  else
    return ERROR;
}
/*
 * 载波设置
 *
 */
void fm17622_setcw(uint8_t cw_mode)
{
  uint8_t reg;

  fm17622_set_reg(JREG_TXCONTROL,0x80);
  if(cw_mode == TX1_TX2_CW_DISABLE){
      fm17622_modify_reg(JREG_TXCONTROL,JBIT_TX1RFEN|JBIT_TX2RFEN,RESET);
      fm17622_get_reg(JREG_TXCONTROL, &reg);  //TODO:该read是不是多余？
  }
  if(cw_mode == TX1_CW_ENABLE){
      fm17622_modify_reg(JREG_TXCONTROL,JBIT_TX1RFEN,SET);
      fm17622_modify_reg(JREG_TXCONTROL,JBIT_TX2RFEN,RESET);
  }
  if(cw_mode == TX2_CW_ENABLE){
      fm17622_modify_reg(JREG_TXCONTROL,JBIT_TX1RFEN,RESET);
      fm17622_modify_reg(JREG_TXCONTROL,JBIT_TX2RFEN,SET);
  }
  if(cw_mode == TX1_TX2_CW_ENABLE){
      fm17622_modify_reg(JREG_TXCONTROL,JBIT_TX1RFEN|JBIT_TX2RFEN,SET);
  }
  mDelay(5);//TODO:需要进行改造


}

void fm17622_get_version(void)
{
  uint8_t reg_data = 0;

  fm17622_get_reg(JREG_VERSION,&reg_data);
  if(reg_data != FM17622_VERSION){
      DS_app_log_error("NFC IC is not FM17622,version=0x%0x!\n",reg_data);
  }
  else {
      DS_app_log_debug("fm17622 version = 0x%0x\n",reg_data);
  }
}


#endif //end of "FM17622_DRIVER"
